/*
 * MensajeAplicacion.h
 *
 *  Created on: 31/01/2010
 *      Author: San Martín, Matías I.
 */

#ifndef MENSAJEAPLICACION_H_
#define MENSAJEAPLICACION_H_

#include <sstream>

#include "Encabezado.h"
#include "DatosMensaje.h"

#include "../../../Middleware/Common/Mensaje.h"

namespace aplicacion {

class MensajeAplicacion : public middleware::Mensaje {

//------------------------------ CONSTANTES ------------------------------
public:

//------------------------------ ATRIBUTOS ------------------------------
private:
	Encabezado _encabezado;
	DatosMensaje* _datos;

//------------------------------ METODOS ------------------------------
public:
	MensajeAplicacion();

	MensajeAplicacion (const Encabezado& encabezado,DatosMensaje* datos);

	virtual ~MensajeAplicacion();

	void setDatos(DatosMensaje* datos);
	void setEncabezado(const Encabezado& encabezado);

	Encabezado& getEncabezado();
	DatosMensaje& getDatos();
	const DatosMensaje& getDatos() const;

	//-------------------- de interfaz middleware::Mensaje
	/**
	 * @see middleware::Mensaje#save(int)
	 */
	virtual size_t save (int fd) const;

	/**
	 * @see middleware::Mensaje#load(int)
	 */
	virtual size_t load (int fd);

	/**
	 * @see middleware::Mensaje#saveToArray(int)
	 */
	virtual size_t saveToArray (uint8_t* arr) const;

	/**
	 * @see middleware::Mensaje#loadFromArray(int)
	 */
	virtual size_t loadFromArray (const uint8_t* arr);

	virtual std::string toString() const
	{
		std::stringstream stm;
		stm << *this;
		return stm.str();
	}

private:
	void actualizarTamanio();

	friend std::ostream &operator<<( std::ostream &stream, const MensajeAplicacion &obj );
};

} // namespace aplicacion

#endif /* MENSAJEAPLICACION_H_ */
